package com.yf.dxapp.module.app.service.token;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import com.yf.dxapp.module.app.controller.admin.token.vo.TokenPageReqVO;
import com.yf.dxapp.module.app.controller.admin.token.vo.TokenSaveReqVO;
import com.yf.dxapp.module.app.dal.dataobject.token.TokenDO;
import com.yf.dxapp.module.app.dal.mysql.token.TokenMapper;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import java.time.LocalDateTime;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.yf.dxapp.module.app.enums.ErrorCodeConstants.DATA_NOT_EXISTS;

/**
 * 登录token Service 实现类
 *
 * @author 芋道源码
 */
@Service
@Validated
public class TokenServiceImpl implements TokenService {

    @Resource
    private TokenMapper okenMapper;

    @Override
    public Long createoken(TokenSaveReqVO createReqVO) {
        // 插入
        TokenDO oken = BeanUtils.toBean(createReqVO, TokenDO.class);
        okenMapper.insert(oken);
        // 返回
        return oken.getId();
    }

    @Override
    public void updateoken(TokenSaveReqVO updateReqVO) {
        // 校验存在
        validateokenExists(updateReqVO.getId());
        // 更新
        TokenDO updateObj = BeanUtils.toBean(updateReqVO, TokenDO.class);
        okenMapper.updateById(updateObj);
    }

    @Override
    public void deleteoken(Long id) {
        // 校验存在
        validateokenExists(id);
        // 删除
        okenMapper.deleteById(id);
    }

    private void validateokenExists(Long id) {
        if (okenMapper.selectById(id) == null) {
            throw exception(DATA_NOT_EXISTS);
        }
    }

    @Override
    public TokenDO getoken(Long id) {
        return okenMapper.selectById(id);
    }

    @Override
    public PageResult<TokenDO> getokenPage(TokenPageReqVO pageReqVO) {
        return okenMapper.selectPage(pageReqVO);
    }


    @Override
    public TokenDO createToken(Long userId, Integer platform,String token) {
        TokenDO tokenEntity = this.findByUserId(userId);
        if (tokenEntity != null) {
            tokenEntity.setToken(token);
            this.initTime(tokenEntity);
            okenMapper.updateById(tokenEntity);
        } else {
            tokenEntity = new TokenDO();
            tokenEntity.setUserId(userId);
            tokenEntity.setToken(token);
            tokenEntity.setType(platform);
            this.initTime(tokenEntity);
            okenMapper.insert(tokenEntity);
        }

        return tokenEntity;
    }

    @Override
    public TokenDO findByUserId(Long userId) {
        TokenPageReqVO req =  new TokenPageReqVO();
        req.setUserId(userId);
        PageResult<TokenDO> result = okenMapper.selectPage(req);
        if(result.getList().isEmpty()){
            return null;
        }
        return result.getList().get(0);
    }

    private TokenDO initTime(TokenDO tokenEntity) {
        LocalDateTime now = LocalDateTime.now();
        tokenEntity.setUpdateTime(now);
        LocalDateTime expire = now.plusHours(48);
        tokenEntity.setExpireTime(expire);
        return tokenEntity;
    }

}